perm filename WIX2SB.FAI[VIS,HPM]9 blob
sn#183727 filedate 1975-10-31 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00017 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 TITLE WIX2SB
C00005 00003 AR2TAB: MOVEI T,44 TOTAL BITS/WORD
C00007 00004 HAFPIC: POP P,RETAD
C00011 00005 GETPAR: POP P,RETAD
C00012 00006 PERBIT: POP P,RETAD
C00013 00007 HISTOG: POP P,RETAD
C00015 00008 ROWSUM: POP P,RETAD
C00016 00009 UNPACK: POP P,RETAD UNPACK A DENSE BYTE ARRAY INTO A PICTURE
C00017 00010 SELECT: POP P,RETAD copy a piece of a picture into another
C00019 00011 ROWSUD: POP P,RETAD much quicker and dirtier than ROWSUM
C00020 00012 SHFT1←←TEMP+1
C00024 00013 COPPIC: POP P,RETAD COPIES A PICTURE IN PIC1
C00025 00014 CORNR←←TEMP THESE FOUR WORDS MUST
C00027 00015 X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D
C00037 00016 CENTRO: POP P,RETAD find centroid of black area in a window
C00039 00017 END
C00040 ENDMK
C⊗;
TITLE WIX2SB
;FULLY FORMAT 2 ORIENTED PICTURE ROUTINES. EXTENSIONS TO THE CONVERTED
;FORMAT 1 ROUTINES IN WIXSUB
ENTRY HAFPIC,COPPIC,MATCH,GETPAR,PERBIT,HISTOG,CMPPAR,ROWSUM,ROWSUD
ENTRY UNPACK,SELECT
EXTERN CORGET,CORREL
INTERN SQRS
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←←12
LINTAB←←13
T←1 ↔ TT←2 ↔ TTT←3 ↔ ARRY1←4 ↔ ARRY2←5 ↔ P←17
A←6 ↔ B←7 ↔ C←10 ↔ D←11 ↔ E←13 ↔ F←14 ↔ G←15
RETAD: 0
TEMP: BLOCK 25 ;TEMPORARY STORAGE FOR STUFF
FOR I←-77,-1,1 { I*4000000+I*I
}
SQRS: FOR I←0,77,1 { I*4000000+I*I
}
AR2TAB: MOVEI T,44 ;TOTAL BITS/WORD
IDIV T,BYBI(ARRY2) ;BYTE SIZE
MOVEM T,WDBY(ARRY2) ;BYTES PER WORD
SUBI TT,44 ;-NUMBER OF USED BITS/WORD
MOVNM TT,WDBI(ARRY2) ;SAVED
ADD T,LNBY(ARRY2)
SUBI T,1
IDIV T,WDBY(ARRY2) ;NUMBER OF WORDS/SCANLINE
MOVEM T,LNWD(ARRY2)
MOVE TT,T ;WORDS/LINE
IMUL TT,WDBY(ARRY2) ;BYTES/WORD
MOVEM TT,LNBYA(ARRY2) ;GIVES BYTES/LINE, INCLUDING NULLS
IMUL TT,PCLN(ARRY2)
MOVEM TT,PCBYA(ARRY2) ;TOTAL BYTES/PIC, INCL. NULLS
IMUL T,PCLN(ARRY2) ;LINES IN THE PICTURE
MOVEM T,PCWD(ARRY2) ;WORDS IN THE PICTURE
MOVE T,LNBY(ARRY2)
IMUL T,PCLN(ARRY2)
MOVEM T,PCBY(ARRY2) ;BYTES/PIC, NOT INCL. NULLS
MOVEI T,14(ARRY2)
ADD T,PCLN(ARRY2)
MOVEM T,BPTAB(ARRY2) ;ADDRESS OF BYTE POINTER TABLE
ADD T,LNBYA(ARRY2) ;ADDR OF FIRST WORD IN PICTURE
MOVN TT,PCLN(ARRY2) ;SET UP CNTR FOR LINE ADDRESSES
HRL TT,TT
HRRI TT,LINTAB(ARRY2)
LTLP: MOVEM T,(TT) ;MAKE LINE TABLE
ADD T,LNWD(ARRY2)
AOBJN TT,LTLP
MOVN TT,BPTAB(ARRY2)
HRL TT,LNBYA(ARRY2) ;SET UP CNTR FOR BYTE TABLE
AOBJN TT, ;DECR ADDRESS AND INCR COUNT BY 1
MOVN TT,TT
MOVEI T,4400
ADD T,BYBI(ARRY2)
LSH T,6
HRLZ T,T
BYLP: MOVEM T,(TT) ;MAKE BYTE POINTER TABLE
IBP T
AOBJN TT,BYLP
POPJ P,
HAFPIC: POP P,RETAD
POP P,G ;MAXBIT
POP P,ARRY2 ;MAKES A HALFSIZE VERSION
POP P,ARRY1 ;OF A PICTURE
MOVE T,LNBY(ARRY1) ;HAFPIC(PICIN,PICOUT,BITMAX);
ASH T,-1 ;NEW PIC IS HALF THE WIDTH
MOVEM T,LNBY(ARRY2)
MOVE T,PCLN(ARRY1)
ASH T,-1 ;AND HALF THE HEIGHT
MOVEM T,PCLN(ARRY2)
MOVE T,BYBI(ARRY1)
ADDI T,2 ;AND HAS TWO MORE BITS/PIXEL
SUB G,T ;UNLESS LIMITED TO LESS
JUMPGE G,.+2
ADD T,G
MOVEM T,BYBI(ARRY2)
PUSHJ P,AR2TAB ;SET UP ITS SKELETON
MOVE A,BPTAB(ARRY1)
MOVE A,-1(A) ;FIRST BYTE PNTR FOR ARRY1
ADD A,LINTAB(ARRY1)
MOVE B,BPTAB(ARRY2)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY2)
MOVE F,PCLN(ARRY2) ;NO OF LINES, FOR COUNT
;IF NOT NEEDED TO REDUCE BITS/BYTE
JUMPGE G,[ LNLP: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE C,A
ADD A,LNWD(ARRY1) ;BP S FOR ARRY1
MOVE D,A
ADD A,LNWD(ARRY1)
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY2)
CLLP: ILDB T,C ;FETCH FOUR BYTES AND ADD THEM
ILDB TT,C
ADD T,TT
ILDB TT,D
ADD T,TT
ILDB TT,D
ADD T,TT
IDPB T,E ;THEN DEPOSIT SUM
SOJG TTT,CLLP
SOJG F,LNLP
JRST @RETAD ]
LNLP1: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE C,A
ADD A,LNWD(ARRY1) ;BP S FOR ARRY1
MOVE D,A
ADD A,LNWD(ARRY1)
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY2)
CLLP1: ILDB T,C ;FETCH FOUR BYTES AND ADD THEM
ILDB TT,C
ADD T,TT
ILDB TT,D
ADD T,TT
ILDB TT,D
ADD T,TT
LSH T,(G) ;TRUNCATE TO CORRECT # OF BITS
IDPB T,E ;THEN DEPOSIT SUM
SOJG TTT,CLLP1
SOJG F,LNLP1
JRST @RETAD
GETPAR: POP P,RETAD
POP P,ARRY2 ;COPIES A FULL WORD ARRAY
POP P,ARRY1 ;INTO A PICTURE
MOVE B,BPTAB(ARRY2)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY2)
MOVE F,PCLN(ARRY2) ;NO OF LINES, FOR COUNT
LNLPG: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY2)
CLLPG: MOVE T,(ARRY1) ;FETCH A WORD
ADDI ARRY1,1
IDPB T,E ;AND DEPOSIT A BYTE
SOJG TTT,CLLPG
SOJG F,LNLPG
JRST @RETAD
PERBIT: POP P,RETAD
POP P,ARRY2 ;transform ;TRANSFORMS EACH SAMPLE OF A
POP P,ARRY1 ;picture ;PICTURE ACCORDING TO A TABLE
HRRM ARRY2,ARF
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPP: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
CLLPP: ILDB T,E ;FETCH A SAMPLE
ARF: MOVE T,(T) ;altered to <ARRY2>(T)
DPB T,E ;AND DEPOSIT IT
SOJG TTT,CLLPP
SOJG F,LNLPP
JRST @RETAD
HISTOG: POP P,RETAD
POP P,ARRY2 ;HISTOGRAM ;MAKES A HISTOGRAM OF THE
POP P,ARRY1 ;picture ;GREY LEVELS IN A PICTURE
HRRM ARRY2,ARFG
HRRM ARRY2,ARFH
MOVEI A,1
LSH A,@BYBI(ARRY1)
SUBI A,1
ARFH: SETZM (A) ;CLEAR THE ARRAY
SOJGE A,ARFH
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPH: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
CLLPH: ILDB T,E ;FETCH A SAMPLE
ARFG: AOS (T) ;altered to <ARRY2>(T)
SOJG TTT,CLLPH
SOJG F,LNLPH
JRST @RETAD
ROWSUM: POP P,RETAD
POP P,ARRY2 ;ROW SUMS ;calculates the sum of each row of a pict
POP P,ARRY1 ;picture
HRRM ARRY2,ARFS
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPS: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
SETZM @ARFS
CLLPS: ILDB T,E ;FETCH A SAMPLE
ARFS: ADDM T,0 ;altered to <ARRY2>(TTT)
SOJG TTT,CLLPS
AOS ARFS
SOJG F,LNLPS
JRST @RETAD
UNPACK: POP P,RETAD ; UNPACK A DENSE BYTE ARRAY INTO A PICTURE
POP P,ARRY1 ;destination picture
POP P,ARRY2 ;original packed array
MOVE C,BPTAB(ARRY1)
ADD ARRY2,-1(C) ;construct byte pntr for source array
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;AND FIRST BP FOR destination
ADD B,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPU: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
CLLPU: ILDB T,C
IDPB T,E ;MOVE A SAMPLE
SOJG TTT,CLLPU
SOJG F,LNLPU
JRST @RETAD
SELECT: POP P,RETAD ;copy a piece of a picture into another
POP P,ARRY2 ;destination picture
POP P,B ;XEDGE
POP P,A ;YEDGE
POP P,ARRY1 ;source picture, part of which is to be copied
ADD B,BPTAB(ARRY1) ;SYNTHESIZE BYTE POINTER
MOVE B,-1(B) ;FOR SOURCE ARRAY
ADDI A,LINTAB(ARRY1)
ADD B,(A)
MOVE A,BPTAB(ARRY2)
MOVE A,-1(A) ;AND FIRST BP FOR destination
ADD A,LINTAB(ARRY2)
MOVE D,BYBI(ARRY2)
SUB D,BYBI(ARRY1)
MOVE F,PCLN(ARRY2) ;NO OF LINES, FOR COUNT
LNLPL: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
MOVE C,A
ADD A,LNWD(ARRY2)
CLLPL: ILDB T,E
LSH T,(D)
IDPB T,C ;MOVE A SAMPLE
SOJG TTT,CLLPL
SOJG F,LNLPL
JRST @RETAD
ROWSUD: POP P,RETAD ;much quicker and dirtier than ROWSUM
POP P,ARRY2 ;ROW SUMS ;roughly calculates row sums
POP P,ARRY1 ;picture
SUBI ARRY2,1
MOVN B,LNWD(ARRY1)
MOVE TTT,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPD: HRL TTT,B ;NO OF WORDS, INNER LOOP CNTR
MOVEI TT,0
CLLPD: HLRZ T,(TTT) ;FETCH A SAMPLE, SORT OF
ADD TT,T
AOBJN TTT,CLLPD
PUSH ARRY2,TT
SOJG F,LNLPD
JRST @RETAD
SHFT1←←TEMP+1
CMPPAR: POP P,RETAD
POP P,ARRY2 ;picture y ;compares two pictures
POP P,ARRY1 ;picture x ;sigma(xi-yi)↑2/n
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;FIRST BP FOR ARRY1
ADD B,LINTAB(ARRY1)
MOVE C,BPTAB(ARRY2)
MOVE C,-1(C) ;AND FIRST BP FOR ARRY2
ADD C,LINTAB(ARRY2)
MOVEI T,5 ;CALCULATE NORMALIZATION SHIFT
SUB T,BYBI(ARRY1) ;FOR MAKING SAMPLES 5 BITS
HRRZM T,SHFT1
MOVEI A,0 ;INITIALIZE SUM
MOVE G,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPC: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
MOVE F,C
ADD C,LNWD(ARRY2)
CLLPC: ILDB T,E ;FETCH A SAMPLE
ILDB TT,F
SUB T,TT
ASH T,@SHFT1
ADD A,SQRS(T) ;and add (xi-yi)↑2 to A
SOJG TTT,CLLPC
SOJG G,LNLPC
TLZ A,777774
IDIV A,PCLN(ARRY1)
IDIV A,LNBY(ARRY1)
MOVE 1,A
JRST @RETAD
COPPIC: POP P,RETAD ;COPIES A PICTURE IN PIC1
POP P,ARRY2 ;INTO PIC2 (THE LINE TABLE MUST
POP P,ARRY1 ;BE ADJUSTED TO DO THIS)
HRLZ T,ARRY1 ; COPPIC(PIC1,PIC2)
HRR T,ARRY2
MOVEI TT,13(ARRY2)
ADD TT,PCLN(ARRY1)
ADD TT,LNBYA(ARRY1)
ADD TT,PCWD(ARRY1)
BLT T,(TT)
MOVE T,ARRY2
SUB T,ARRY1
MOVN TT,PCLN(ARRY1)
SUBI TT,1
HRLZ TT,TT
HRRI TT,BPTAB(ARRY2)
COPLP: ADDM T,(TT)
AOBJN TT,COPLP
JRST @RETAD
CORNR←←TEMP ;THESE FOUR WORDS MUST
HORIZ←←TEMP+1 ;BE KEPT IN THIS ORDER
CENTR←←TEMP+2
VERTI←←TEMP+3
WHERTO: BYTE (2)0,3,3,0,1,2,2,1,1,2,2,1,0,3,3,0
WHERPN: POINT 2,WHERTO
VERCNT←←TEMP+4
HORCNT←←TEMP+5
FLAPIC: POP P,RETAD ;HIGH PASS FILTER WITH A CUTOFF
POP P,ARRY1 ;1/FREQUENCY APPROIMATELY HALF THE
SETZM CORNR
SETZM HORIZ
SETZM VERTI
SETZM CENTR
MOVE T,PCLN(ARRY1) ;WIDTH AND HEIGHT OF THE PICTURE,
MOVE TT,T ;MAINLY TO REMOVE THE EFFECTS
ASH T,-2 ;OF COS↑2 DARKENING AT THE EDGES
MOVEM T,VERCNT ; FLAPIC(PICTURE)
MOVE T,LNBY(ARRY1)
ASH T,-2 ;THE LIMITS OF EACH GRID POINT
MOVEM T,HORCNT
X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D
AX1←←TEMP ↔ AY1←←TEMP+1 ↔ AX2←←TEMP+2 ↔ AY2←←TEMP+3
BX1←←TEMP+4 ↔ BY1←←TEMP+5 ↔ BX2←←TEMP+6 ↔ BY2←←TEMP+7
SOUWIN←←TEMP+10 ↔ DESWIN←←TEMP+11 ↔ DEXSKP←←TEMP+12 ↔ DEYSKP←←TEMP+13
WSIZ1←←TEMP+14 ↔ DWSIZ←←TEMP+15 ↔ WSIZY1←←TEMP+16 ↔ VARIAN←←TEMP+17
SOUSIZ←←TEMP+20 ↔ WSIZ←←TEMP+21 ↔ DWSIZ←←TEMP+22
SHFT1←←TEMP+23 ↔ SHFT2←←TEMP+24
MATCH: POP P,RETAD
POP P,BX2 ;A CORRELATOR. FINDS THE BEST MATCH
POP P,BY2 ;TO RECTANGLE ARRY1(AX1:AX2,AY1:AY2)
POP P,BX1 ;IN ARRY2(BX1:BY1,BX2:BY2)
POP P,BY1 ;ALL ARGUMENT ARE BY REFERENCE. THE
POP P,ARRY2 ;A'S AND B'S MAY BE ADJUSTED TO MAKE
MOVE X1,@BX1 ;THINGS FIT
MOVE X2,@BX2 ; MATCH(PIC1,AX1,AY1,AX2,AY2,
MOVE Y1,@BY1 ; PIC2,BX1,BY1,BX2,BY2);
MOVE Y2,@BY2
FIXB: CAMLE X1,X2 ;FIRST FIX UP THE LIMITS SO
EXCH X1,X2 ;X1≤X2, X1≥0 X2<WIDTH ETC.
CAIGE X1,0
MOVEI X1,0
MOVE T,LNBY(ARRY2)
CAML X2,T
MOVEI X2,-1(T)
CAMLE Y1,Y2 ;SIMILAR FOR Y
EXCH Y1,Y2
CAIGE Y1,0
MOVEI Y1,0
MOVE T,PCLN(ARRY2)
CAML Y2,T
MOVEI Y2,-1(T)
CAMG X1,X2
CAMLE Y1,Y2
JRST FIXB
MOVEM X1,@BX1
MOVEM X2,@BX2
MOVEM Y1,@BY1
MOVEM Y2,@BY2
POP P,AX2 ;DO SAME FOR SOURCE WINDOW
POP P,AY2
POP P,AX1
POP P,AY1
POP P,ARRY1
MOVE X1,@AX1
MOVE X2,@AX2
MOVE Y1,@AY1
MOVE Y2,@AY2
MOVEI T,5 ;CALCULATE SHIFTS NEEDED TO
SUB T,BYBI(ARRY1) ;CHANGE BOTH WINDOWS TO
HRRZM T,SHFT1 ;FIVE BITS/SAMPLE (TO FIT THE SQUARES
MOVEI T,5 ;TABLE)
SUB T,BYBI(ARRY2)
HRRZM T,SHFT2
FIXA: CAMLE X1,X2 ;FIRST FIX UP THE LIMITS SO
EXCH X1,X2 ;X1≤X2, X1≥0 X2<WIDTH ETC.
CAIGE X1,0
MOVEI X1,0
MOVE T,LNBY(ARRY1)
CAML X2,T
MOVEI X2,-1(T)
CAMLE Y1,Y2 ;SIMILAR FOR Y
EXCH Y1,Y2
CAIGE Y1,0
MOVEI Y1,0
MOVE T,PCLN(ARRY1)
CAML Y2,T
MOVEI Y2,-1(T)
CAMG X1,X2
CAMLE Y1,Y2
JRST FIXA
MOVE T,@BX1 ;SHRINK SOURCE WINDOW SYMMETRICALLY
SUB T,@BX2 ;UNTIL IT IS NO
ADD T,X2 ;LARGER THAN DESTINATION WINDOW
SUB T,X1
JUMPLE T,YSHRNK
MOVEI TT,1(T)
ASHC T,-1
ADDI X1,(T)
SUBI X2,(TT)
YSHRNK: MOVE T,@BY1 ;SHRINK IN Y DIRECTION
SUB T,@BY2 ;UNTIL IT IS NO
ADD T,Y2 ;LARGER THAN DESTINATION WINDOW
SUB T,Y1
JUMPLE T,RESTA
MOVEI TT,1(T)
ASHC T,-1
ADDI Y1,(T)
SUBI Y2,(TT)
RESTA: MOVEM X1,@AX1
MOVEM Y1,@AY1
MOVEM X2,@AX2
MOVEM Y2,@AY2
THIS←←TT ↔ SIZ←←TTT
MOVEI SIZ,1(X2) ;CALCULATE SIZE OF BUFFER AREA
SUB SIZ,X1 ;FOR THE SOURCE WINDOW CODE
MOVEM SIZ,WSIZ1 ;WILL BE X WINDOWSIZE-1
MOVEM SIZ,WSIZ ;IS X WINDOWSIZ
MOVNM SIZ,DEXSKP ;WILL BE DELTA XB - DELTA XA
MOVEI T,1(Y2)
SUB T,Y1
MOVEM T,WSIZY1 ;WILL BE X WINDOWSIZE-1
MOVNM T,DEYSKP ;WIL BE DELTA YB - DELTA YA
IMUL SIZ,T
MOVEM SIZ,SOUSIZ ;SOURCE WINDOW SIZE (IN PIXELS)
ASH SIZ,1
ADDI SIZ,1
PUSHJ P,CORGET ;AND MAKE THAT BUFFER
HALT
MOVEM THIS,SOUWIN
SUBI THIS,1
MOVN T,T
HRLZ T,T
HRRI T,LINTAB(ARRY1) ;Y COUNTER
ADD T,Y1
MOVE 0,@BX2 ;FINISH UP MAKING DELTA XB -DELTA XA
SUB 0,@BX1
ADDI 0,1
MOVEM 0,DWSIZ
ADDM 0,DEXSKP
MOVE 0,@BY2 ;AND THE Y'S TOO
SUB 0,@BY1
ADDI 0,1
ADDM 0,DEYSKP
SOS WSIZ1 ;NOT TO MENTION X WINDOWSIZ-1
SOS WSIZY1 ;AND Y WINDOWSIZ-1
MOVE G,[MOVN TT,0(T)]
MOVE E,BPTAB(ARRY1) ;BP SKELETON
ADDI E,-1(X1)
MOVE E,(E)
SETZB B,A ;FOR SUM OF X AND X↑2, AS EXPLND BELOW
;DON'T FORGET! A,B,C,D ARE X1,X2,Y1,Y2 ALSO
ILYLP: MOVE F,E ;SETS UP IN LINE CODED
ADD F,(T) ;STUFF FOR THE INNER
MOVE TTT,WSIZ ;"LOOP" OF THE CORRELATION
ILXLP: PUSH THIS,G ;A SEQUENCE OF
ADDI G,1 ; MOVN TT,POSB(T)
ILDB C,F ; ADD A,SQRS+PIXEL(TT)
LSH C,@SHFT1
ADD B,C
ADD A,SQRS(C)
ADD C,[ADD A,SQRS(TT)]
PUSH THIS,C
SOJG TTT,ILXLP
ADD G,DEXSKP
AOBJN T,ILYLP
TLZ A,777774
PUSH THIS,[JRST INRDON] ;AND THE FINAL INSTR.
;CALCULATE SUM[(X-XBAR)↑2] ALSO. THIS IS SAME AS SUM[X↑2-2 X XBAR+XBAR↑2],
;WHICH IS SUM[X↑2]-2 XBAR SUM[X]+XBAR↑2*N OR, SINCE XBAR=SUM[X]/N,
;SUM[X↑2]-2(SUM[X])↑2/N+(SUM[X])↑2/N WHICH IS SUM[X↑2]-(SUM[X])↑2/N
; THIS QUANTITY WILL BE CALLED VARIANCE
IMUL B,B
IDIV B,SOUSIZ
SUB A,B
MOVEM A,VARIAN
MOVE X1,@BX1 ;MAKE THE DESTINATION
MOVE X2,@BX2 ;WINDOW BUFFER
MOVE Y1,@BY1
MOVE Y2,@BY2
MOVEI SIZ,1(X2)
SUB SIZ,X1
MOVEM SIZ,DWSIZ
MOVEI T,1(Y2)
SUB T,Y1
IMUL SIZ,T
PUSHJ P,CORGET
HALT
MOVEM THIS,DESWIN
SUBI THIS,1
MOVN T,T ;Y COUNTER
HRLZ T,T
HRRI T,LINTAB(ARRY2)
ADD T,Y1
MOVE E,BPTAB(ARRY2) ;BYTE POINTER SKELETON
ADDI E,-1(X1) ;FOR DESTINATION
MOVE E,(E)
BUYLP: MOVE F,E ;UNPACKS THE DESTINATION
ADD F,(T) ;WINDOW, ONE WORD/SAMPLE
MOVE TTT,DWSIZ
BUXLP: ILDB 0,F
LSH 0,@SHFT2
PUSH THIS,0
SOJG TTT,BUXLP
AOBJN T,BUYLP
MOVN B,DEXSKP ;NOW ACTUALLY CORRELATE
SUBI B,1
HRLZI D,377777 ;VALUE OF BEST MATCH IN D
MOVE E,DESWIN ;LOCATION IN E
MOVE C,DEYSKP ;NUMBER OF ROWS
MOVE T,DESWIN ;WHERE TO START
CRYLP: HRL T,B ;INIT X CNTR, BUT KEEP OLD POSN
CRXLP: MOVEI A,0 ;ACCUMULATE CURRENT SUM IN A
JRST @SOUWIN ;JUMP TO PREVIOUSLY CREATED CODE
INRDON: TLZ A,777774 ;clear sum field, leaving only square
CAML A,D ;SEE IN NEW SUM IS BETTER
JRST .+3
MOVE D,A ;IF SO, RECORD IT
HRRZ E,T
AOBJN T,CRXLP ;SHIFT IN X, AND TRY AGAIN
ADD T,WSIZ1 ;ADD WHATS NEEDED TO GET TO NEXT
SOJGE C,CRYLP ;SCANLINE, AND TRY AGAIN
SUB E,DESWIN ;DECOMPOSE SAVED BEST LOCATION
IDIV E,DWSIZ ;INTO X AND Y PARTS
ADDB E,@BY1 ;ACTUAL LOWER Y BOUND OF BEST MATCH
ADDB F,@BX1 ;ACTUAL LOWER X BOUND OF BEST MATCH
ADD F,WSIZ1 ;COMPUTE UPPER X BOUND
MOVEM F,@BX2 ;AND RETURN IT
ADD E,WSIZY1 ;UPPER Y BOUND
MOVEM E,@BY2 ;RETURNED
MOVE THIS,SOUWIN ;RETURN THE USED CORAGE
PUSHJ P,CORREL
MOVE THIS,DESWIN
PUSHJ P,CORREL
MOVE 1,D ;GET READY TO RETURN VALUE OF MATCH
ASH 1,4 ;SCALE IT UP BY 2↑4
IDIV 1,VARIAN ;NORMALIZE
JRST @RETAD ;AND RETURN
CENTRO: POP P,RETAD ;find centroid of black area in a window
POP P,E ;threshold
POP P,D ;X2
POP P,C ;Y2
POP P,B ;X1
POP P,A ;Y1
POP P,ARRY1 ;source picture
ADD B,BPTAB(ARRY1) ;SYNTHESIZE BYTE POINTER
MOVE B,-1(B) ;FOR SOURCE ARRAY
ADDI A,LINTAB(ARRY1)
ADD B,(A)
X2←←D ↔ Y2←←C ↔ X1←←B ↔ Y1←←A
CAMLE X1,X2 ;FIX UP LIMITS
EXCH X1,X2
CAMLE Y1,Y2
EXCH Y1,Y2
CAIL X2,0
CAML X1,LNBY(ARRY1)
JRST GUPP
CAIL Y2,0
CAML Y1,PCLN(ARRY1)
JRST GUPP
CAIGE X1,0
MOVEI X1,0
MOVE T,LNBY(ARRY1)
CAML X2,T
MOVEI X2,-1(T)
CAIGE Y1,0
MOVEI Y1,0
MOVE T,PCLN(ARRY1)
CAML Y2,T
MOVEI Y2,-1(T)
SUB Y2,Y1 ;NO OF LINES, FOR COUNT
SUB X2,X1 ;NO OF COLUMNS
LNLCE: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
MOVE C,A
ADD A,LNWD(ARRY2)
CLLPCE: ILDB T,E
LSH T,(D)
IDPB T,C ;MOVE A SAMPLE
SOJG TTT,CLLPCE
SOJG F,LNLPCE
JRST @RETAD
END